home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1998 January: Mac OS SDK / Dev.CD Jan 98 SDK2.toast / Development Kits (Disc 2) / QuickDraw GX / Programming Stuff / GXEdit Library & Doc / GXEditNewRun.c < prev    next >
Encoding:
C/C++ Source or Header  |  1995-04-10  |  4.1 KB  |  194 lines  |  [TEXT/MPS ]

  1. /*
  2.     File:                GXEditNewRun.c
  3.     
  4.     Contains:
  5.     
  6.     Written by:        Barton R. House
  7.     
  8.     Copyright:        © 1993 by Apple Computer, Inc., All rights reserved.
  9.     
  10. */
  11.  
  12. #include "GXEdit.h"
  13. #include "GXEditDebug.h"
  14. #include "GXEditDoc.h"
  15. #include "GXEditNewRun.h"
  16. #include "GXEditStyle.h"
  17. #include "GXEditError.h"
  18.  
  19. #include "graphics routines.h"
  20. #include "graphics libraries.h"
  21. #include "font routines.h"
  22. #include "math routines.h"
  23. #include "layout routines.h"
  24.  
  25.  
  26. static void CalcNewRunStarts(NewRunPtr rp, short runOffset);
  27.  
  28. void InsertNewRunText(DocPtr dp, NewRunPtr rp, short runOffset, void * text, short numText)
  29. {
  30.     
  31.     if(runOffset < 0 || runOffset > rp->numText)
  32.         gxEditPostError(dp, gx_edit_internal_fatal_error);
  33.     
  34.     rp->numText += numText;
  35.     
  36.     /* resize the data structures */
  37.     
  38.     SetHandleSize((Handle) rp->text, rp->numText);
  39.     
  40.     /* shift the text data */
  41.     
  42.     BlockMove((Ptr) ((long) *rp->text + (runOffset)),
  43.               (Ptr) ((long) *rp->text + ((runOffset + numText))),
  44.                     (rp->numText - runOffset - numText));
  45.     
  46.     /* copy the new text data */
  47.     
  48.     BlockMove((Ptr) text, (Ptr) ((long) *rp->text + (runOffset)), numText);
  49.             
  50. }
  51.  
  52. void SplitNewRun(DocPtr dp, NewRunPtr rp, short runOffset, NewRunPtr newRun)
  53. {
  54.     long            size;
  55.         
  56.     if(runOffset < 0 || runOffset > rp->numText)
  57.         gxEditPostError(dp, gx_edit_internal_fatal_error);
  58.     
  59.     /* initialize the new run */
  60.     
  61.     newRun->styleIndex = rp->styleIndex;
  62.     
  63.     IncrementDocStyleRefCount(dp, rp->styleIndex);
  64.     
  65.     newRun->paraOffset = rp->paraOffset + runOffset;
  66.     newRun->numText = rp->numText - runOffset;
  67.     
  68.     /* adjust the old gxLine */
  69.     
  70.     rp->numText = runOffset;
  71.     
  72.     /* create and copy over the text */
  73.     
  74.     size = newRun->numText;
  75.     newRun->text = (void **) NewHandle(size);
  76.     
  77.     BlockMove((Ptr) ((long) *rp->text + (runOffset)), (Ptr) *newRun->text, size);
  78.                 
  79.     /* adjust the size of the text */
  80.     
  81.     size = rp->numText;
  82.     SetHandleSize((Handle) rp->text, size);
  83.     
  84. }
  85.  
  86. /* join the two runs, freeing up the right run */
  87.  
  88. void JoinNewRuns(DocPtr dp, NewRunPtr left, NewRunPtr right)
  89. {
  90.     short            runOffset;
  91.     
  92.     if(left->styleIndex != right->styleIndex)
  93.         gxEditPostError(dp, gx_edit_internal_fatal_error);
  94.     
  95.     runOffset = left->numText;
  96.     
  97.     left->numText += right->numText;
  98.     
  99.     /* grow the data structures */
  100.     
  101.     SetHandleSize((Handle) left->text, left->numText);
  102.     
  103.     /* copy over the glyph information */
  104.     
  105.     BlockMove((Ptr) *right->text, (Ptr) ((long) *left->text + (runOffset)),
  106.                                         right->numText);
  107.     
  108.     /* dispose of the right side data structures */
  109.     
  110.     DisposeNewRun(dp, right);
  111.     
  112. }
  113.  
  114. void NewNewRun(DocPtr dp, NewRunPtr rp, short styleIndex)
  115. {
  116.     rp->styleIndex = styleIndex;
  117.     
  118.     IncrementDocStyleRefCount(dp, styleIndex);
  119.         
  120.     rp->paraOffset = 0;
  121.     rp->numText = 0;
  122.     rp->text = (void **) NewHandle(0);
  123.             
  124. }
  125.  
  126. void NewRunClear(DocPtr dp, NewRunPtr rp, short runOffset, short numText)
  127. {
  128.     long            size;
  129.     
  130.     if(numText == 0)
  131.         return;
  132.         
  133.     if(runOffset < 0 || runOffset > rp->numText)
  134.         gxEditPostError(dp, gx_edit_internal_fatal_error);
  135.         
  136.     if(runOffset + numText > rp->numText)
  137.         gxEditPostError(dp, gx_edit_internal_fatal_error);
  138.         
  139.     size = (rp->numText - runOffset - numText);
  140.     BlockMove((Ptr)((long) *rp->text + ((runOffset + numText))),
  141.               (Ptr)((long) *rp->text + (runOffset)), size);
  142.  
  143.     rp->numText -= numText;
  144.     
  145.     size = rp->numText;
  146.     SetHandleSize((Handle) rp->text, size);
  147.     
  148. }
  149.  
  150. void DisposeNewRun(DocPtr dp, NewRunPtr rp)
  151. {
  152.     DisposeHandle((Handle) rp->text);
  153.     
  154.     DecrementDocStyleRefCount(dp, rp->styleIndex);
  155. }
  156.  
  157. void SetNewRunTextFont(DocPtr dp, NewRunPtr rp, gxFont fontId)
  158. {
  159.     void        * runFont;
  160.     
  161.     runFont = (void *) GetDocStyleTextFont(dp, rp->styleIndex);
  162.     
  163.     if(runFont == fontId) {
  164.         gxEditPostError(dp, gx_edit_internal_fatal_error);
  165.         return;
  166.     }
  167.     
  168.     DecrementDocStyleRefCount(dp, rp->styleIndex);
  169.     
  170.     rp->styleIndex = SetDocStyleTextFont(dp, rp->styleIndex, fontId);
  171.     
  172.     IncrementDocStyleRefCount(dp, rp->styleIndex);
  173.  
  174. }
  175.  
  176. void SetNewRunTextSize(DocPtr dp, NewRunPtr rp, short textSize)
  177. {
  178.     short        runSize;
  179.     
  180.     runSize = GetDocStyleTextSize(dp, rp->styleIndex);
  181.     
  182.     if(runSize == textSize) {
  183.         gxEditPostError(dp, gx_edit_internal_fatal_error);
  184.         return;
  185.     }
  186.         
  187.     DecrementDocStyleRefCount(dp, rp->styleIndex);
  188.     
  189.     rp->styleIndex = SetDocStyleTextSize(dp, rp->styleIndex, textSize);
  190.     
  191.     IncrementDocStyleRefCount(dp, rp->styleIndex);
  192.  
  193. }
  194.